package com.ruoyi.employee.mapper;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import com.ruoyi.employee.domain.HrContract;

/**
 * 合同管理Mapper接口
 *
 * @author hango
 * @date 2025-10-19
 */
public interface HrContractMapper
{
    /**
     * 查询合同管理
     *
     * @param id 合同管理主键
     * @return 合同管理
     */
    public HrContract selectHrContractById(Long id);

    /**
     * 查询合同管理列表
     *
     * @param hrContract 合同管理
     * @return 合同管理集合
     */
    public List<HrContract> selectHrContractList(HrContract hrContract);

    /**
     * 查询合同管理列表（联表：员工/公司/部门/岗位）
     *
     * @param hrContract 合同管理
     * @return 列表数据（包含展示字段）
     */
    public List<Map<String, Object>> selectHrContractListWithJoin(HrContract hrContract);

    /**
     * 查询合同管理（联表详情）
     *
     * @param id 合同管理主键
     * @return 详情数据（包含展示字段）
     */
    public Map<String, Object> selectHrContractByIdWithJoin(Long id);

    /**
     * 查询员工当前生效的合同（最新一条）
     *
     * @param empId 员工ID
     * @return 合同管理
     */
    public HrContract selectActiveByEmpId(@Param("empId") Long empId);

    /**
     * 新增合同管理
     *
     * @param hrContract 合同管理
     * @return 结果
     */
    public int insertHrContract(HrContract hrContract);

    /**
     * 修改合同管理
     *
     * @param hrContract 合同管理
     * @return 结果
     */
    public int updateHrContract(HrContract hrContract);

    /**
     * 删除合同管理
     *
     * @param id 合同管理主键
     * @return 结果
     */
    public int deleteHrContractById(Long id);

    /**
     * 批量删除合同管理
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteHrContractByIds(Long[] ids);


    /**
     * 合同编号唯一性校验（编辑时排除自己）
     *
     * @param contractNo 合同编号
     * @param id 主键（可为空）
     * @return 数量
     */
    public int checkContractNoUnique(@Param("contractNo") String contractNo, @Param("id") Long id);

    /**
     * 查询指定员工的最大签订次数
     *
     * @param empId 员工ID
     * @return 最大签订次数（为空返回0）
     */
    public Integer selectMaxSignTimesByEmpId(@Param("empId") Long empId);

    /**
     * 校验合同区间是否与该员工已有合同重叠
     *
     * @param empId 员工ID
     * @param id 当前主键（编辑时传，新增可空）
     * @param startDate 开始日期
     * @param endDate 结束日期（无固定期限可空）
     * @return 数量
     */
    public int countOverlapByEmp(@Param("empId") Long empId,
                                 @Param("id") Long id,
                                 @Param("startDate") Date startDate,
                                 @Param("endDate") Date endDate);

    /**
     * 将已到期的合同标记为“已到期”
     *
     * @return 受影响行数
     */
    public int markExpired();

    /**
     * 查询N天内到期的合同列表
     *
     * @param days 天数
     * @return 列表数据
     */
    public List<Map<String, Object>> selectContractDueInDays(@Param("days") int days);

    /**
     * 查询处于提醒窗口内的试用期到期合同列表
     *
     * @return 列表数据
     */
    public List<Map<String, Object>> selectProbationDueList();
}
